116. 填充每个节点的下一个右侧节点指针
116. 填充每个节点的下一个右侧节点指针
Similar Question
leading to the advanced question
Solution Tips
第一想法是依赖 depth, 其实是不依赖的
方案一: BFS
const {BST} = require('./utils/structure/BST')
const bst = new BST()
bst.insert(1)
bst.insert(2)
bst.insert(3)
bst.insert(4)
bst.insert(5)
bst.insert(6)
bst.insert(7)
var connect = function(root) {
const level = []
preorder(root,0,level)
level.forEach((subQueue) => {
subQueue.forEach((node,index,subQueue) => {
if(node!==null) node.next = subQueue[index+1] || null
})
})
return root
function preorder(node,depth,level){
if(depth>level.length-1) level.push([])
if (node === null) {
level[depth].push(node)
} else {
level[depth].push(node)
preorder(node.left, depth + 1, level)
preorder(node.right, depth + 1, level)
}
}
}
console.log(connect(bst.root()))
var connect = function(root) {
if (root === null) {
return root;
}
// 初始化队列同时将第一层节点加入队列中,即根节点
const Q = [root];
// 外层的 while 循环迭代的是层数
while (Q.length > 0) {
// 记录当前队列大小
const size = Q.length;
// 遍历这一层的所有节点
for(let i = 0; i < size; i++) {
// 从队首取出元素
const node = Q.shift();
// 连接
if (i < size - 1) {
node.next = Q[0];
}
// 拓展下一层节点
if (node.left !== null) {
Q.push(node.left);
}
if (node.right !== null) {
Q.push(node.right);
}
}
}
// 返回根节点
return root;
};
方案二: 递归 + 不依赖 Depth
const {BST} = require('./utils/structure/BST')
const bst = new BST()
bst.insert(1)
bst.insert(2)
bst.insert(3)
bst.insert(4)
bst.insert(5)
bst.insert(6)
bst.insert(7)
var connect = function(root) {
const level = []
preorder(root,0,level)
level.forEach((subQueue) => {
subQueue.forEach((node,index,subQueue) => {
if(node!==null) node.next = subQueue[index+1] || null
})
})
return root
function preorder(node,depth,level){
if(depth>level.length-1) level.push([])
if (node === null) {
level[depth].push(node)
} else {
level[depth].push(node)
preorder(node.left, depth + 1, level)
preorder(node.right, depth + 1, level)
}
}
}
console.log(connect(bst.root()))